package ninth.同步与死锁;

class MT implements Runnable {
    private int ticket = 5;

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            if (ticket > 0) {
                try {
                    Thread.sleep(10000);// 加入延迟
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
                System.out.println("卖票：ticket = " + ticket--);
            }
        }
    }
}

public class 问题的引出 {
    public static void main(String[] args) {
        MT mt = new MT();// 定义线程对象
        Thread t1 = new Thread(mt);// 定义Thread对象
        Thread t2 = new Thread(mt);// 定义Thread对象
        Thread t3 = new Thread(mt);// 定义Thread对象
        t1.start();     // 启动线程
        t2.start();
        t3.start();
    }
}
/**
 * 从上面的程序中可以看出 程序中加入了延迟操作 所以在运行的最后出现了负数的情况
 * 那么为什么会产生这样的问题呢？
 * 杜宇票数的操作步骤如下：
 * ①判断票数是否 >0 如果大于0，则表示还有票可以卖
 * ②如果票数大于0，则卖票出去
 * 但是在上面的操作代码中 在①和②之间加入了延迟操作 那么一个线程有可能在还没有对票数进行操作之前 其他线程就将票数减少了，
 * 因此出现了负数的情况
 * 要想解决就必须要用同步，
 * 所谓同步，就是指多个操作在同一个时间段内只能有一个线程进行，其他线程要等待此线程完成之后才可以继续执行
 */

/*
D:\WorkSpaces\Java\jdk-21\bin\java.exe "-javaagent:D:\Software\IntelliJ IDEA\IntelliJ IDEA 2023.3.2\lib\idea_rt.jar=56931:D:\Software\IntelliJ IDEA\IntelliJ IDEA 2023.3.2\bin" -Dfile.encoding=UTF-8 -Dsun.stdout.encoding=UTF-8 -Dsun.stderr.encoding=UTF-8 -classpath D:\WorkSpaces\JavaDevelopBase_start_329\out\production\JavaDevelopBase_start_329 ninth.同步与死锁.问题的引出
卖票：ticket = 5
卖票：ticket = 4
卖票：ticket = 5
卖票：ticket = 3
卖票：ticket = 3
卖票：ticket = 2
卖票：ticket = 1
卖票：ticket = 1
卖票：ticket = 0
卖票：ticket = -1 自己造出来的 试了好几次没出来负数
Process finished with exit code 0

 */